﻿using System;
using System.Collections.Generic;
using System.Linq;
using Cesave.Domain.PermisosModule.Contracts.Ciclos;
using Cesave.Domain.PermisosModule.Entities;
using Cesave.Infrastructure.CrossCutting.Logging;
using Cesave.Infrastructure.Data.Core;
using Cesave.Infrastructure.Data.PermisosModule.Context;

namespace Cesave.Infrastructure.Data.PermisosModule.Repositories
{
	/// <summary>
	/// 
	/// </summary>
	public class CicloRepository
		: GenericRepositoryEx<Ciclo>, ICicloRepository
	{
		#region Constructor

		/// <summary>
		/// 
		/// </summary>
		/// <param name="context"></param>
		/// <param name="traceManager"></param>
		public CicloRepository(IPermisosModuleContext context, ITraceManager traceManager)
			: base(context, traceManager)
		{
		}

		#endregion

		#region ICicloRepository Members

		/// <summary>
		/// 
		/// </summary>
		/// <returns></returns>
		public IEnumerable<Ciclo> FindAllCiclos()
		{
			return GetAll()
				.OrderBy(ciclo => ciclo.Nombre);
		}

		/// <summary>
		/// 
		/// </summary>
		/// <param name="ciclosByStatusSpecification"></param>
		/// <returns></returns>
		public IEnumerable<Ciclo> FindCiclosByStatusSpecification(CiclosByStatusSpecification ciclosByStatusSpecification)
		{
			if (ciclosByStatusSpecification == null)
				throw new ArgumentNullException("ciclosByStatusSpecification");
			return GetFilteredElements(ciclosByStatusSpecification.SatisfiedBy(), ciclo => ciclo.Nombre, true);
		}
		
		/// <summary>
		/// 
		/// </summary>
		/// <param name="cicloByGuidSpecification"></param>
		/// <returns></returns>
		public Ciclo FindCicloByGuidSpecification(CicloByGuidSpecification cicloByGuidSpecification)
		{
			if (cicloByGuidSpecification == null)
				throw new ArgumentNullException("cicloByGuidSpecification");
			return GetBySpec(cicloByGuidSpecification).FirstOrDefault();
		}

		/// <summary>
		/// 
		/// </summary>
		/// <param name="cicloActualSpecification"></param>
		/// <returns></returns>
		public Ciclo FindCicloByCicloActualSpecification(CicloActualSpecification cicloActualSpecification)
		{
			if (cicloActualSpecification == null)
				throw new ArgumentNullException("cicloActualSpecification");
			return GetBySpec(cicloActualSpecification).FirstOrDefault();
		}

		#endregion
	}
}
